/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao;

import connection.AbstractConnection;
import entidades.Entrada;
import entidades.Fornecedor;
import entidades.Funcionario;
import entidades.ProdutoEntrada;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Ricardo
 */
public class EntradaDAO extends AbstractDAO {

    private final String sqlByFuncionario =
            "select * from entrada where funcionario_pessoa_fisica_pessoa_idpessoa=?";
    private final String sqlByFornecedor =
            "select * from entrada where fornecedor_pessoa_juridica_pessoa_idpessoa=?";
    private final String sqlInsert =
            "insert into entrada (identrada,fornecedor_pessoa_juridica_pessoa_idpessoa,funcionario_pessoa_fisica_pessoa_idpessoa,data_entrada,valor_entrada) values (?,?,?,?,?)";

    public EntradaDAO(AbstractConnection conn) {
        super(conn);
    }

    public List<Entrada> getEntradaByFuncionario(int id) throws SQLException {
        return getEntradas(sqlByFuncionario, id);
    }

    public List<Entrada> getEntradaByFornecedor(int id) throws SQLException {
        return getEntradas(sqlByFornecedor, id);
    }

    private List<Entrada> getEntradas(String sql, int id) throws SQLException {
        List<Entrada> resultList = new ArrayList<Entrada>();

        PreparedStatement ps = conn.getConnection().prepareStatement(sql);
        ps.setInt(1, id);

        ResultSet rs = ps.executeQuery();

        while (rs.next()) {
            resultList.add(getEntrada(rs));
        }

        conn.closeConnection();

        return resultList;
    }

    private Entrada getEntrada(ResultSet rs) throws SQLException {
        Entrada entrada = new Entrada();

        entrada.setId(rs.getInt("identrada"));
        entrada.setDataEntrada(rs.getDate("data_entrada"));
        entrada.setValorEntrada(rs.getFloat("valor_entrada"));
        entrada.setFuncionario(getFuncionario(rs.getInt("funcionario_pessoa_fisica_pessoa_idpessoa")));
        entrada.setFornecedor(getFornecedor(rs.getInt("fornecedor_pessoa_juridica_pessoa_idpessoa")));
        entrada.setProdutos(getProdutos(rs.getInt("identrada")));

        return entrada;
    }

    private Fornecedor getFornecedor(int id) throws SQLException {
        Fornecedor forn = (new FornecedorDAO(getNewConnection()).getFornecedorById(id));

        return forn;
    }

    private Funcionario getFuncionario(int id) throws SQLException {
        Funcionario func = null;

        func = (new FuncionarioDAO(getNewConnection()).getFuncionarioById(id));

        return func;
    }

    private List<ProdutoEntrada> getProdutos(int id) throws SQLException {
        List<ProdutoEntrada> produtos = null;

        produtos = (new ProdutoEntradaDAO(getNewConnection()).getProdutosByIdEntrada(id));

        return produtos;
    }

    public void inserir(Entrada entrada) throws SQLException {
        PreparedStatement ps = conn.getConnection().prepareStatement(sqlInsert);
        int newId = getNextId("entrada", "identrada");

        ProdutoEntradaDAO pe = new ProdutoEntradaDAO(getNewConnection());

        ps.setInt(1, newId);
        ps.setInt(2, entrada.getFornecedor().getId());
        ps.setInt(3, entrada.getFuncionario().getId());
        ps.setDate(4, new java.sql.Date(entrada.getDataEntrada().getTime()));
        ps.setFloat(5, new Float(entrada.getValorEntrada()));
        pe.inserir(entrada.getProdutos(), newId);

        ps.executeQuery();

        conn.closeConnection();
    }
}
